----- 数据读取 -----


03 功能码
/*--------------------widget.h --------------------*/
void readHoldingRegisters(quint8 slaveAddress, quint16 startAddress, quint16 count, int id)
 
/*--------------------widget.cpp --------------------*/
//读取保持寄存器(03 功能码)
void Widget::readHoldingRegisters(quint8 slaveAddress, quint16 startAddress, quint16 count, int id)
{
    //检查连接
    if (RTU_Device->state() != QModbusDevice::ConnectedState){
        qDebug() << "Modbus 设备未连接";
        return;
    }
 
    //创建读取请求
    QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, startAddress, count);
 
    //发送请求
    if (auto *reply = RTU_Device->sendReadRequest(readUnit, slaveAddress)){
        if (!reply->isFinished()){
            connect(reply, &QModbusReply::finished, this, [reply, this, id](){
                if (reply->error() == QModbusDevice::NoError){
                    const QModbusDataUnit unit = reply->result();
                    for (int i = 0; i < unit.valueCount(); i++){
                        qDebug() << "寄存器" << unit.startAddress() + i << "的值:" << unit.value(i);
                        switch (id) {
                        case 1:
                        {
                            qDebug() <<"第一个寄存器 = " << unit.value(0);
                            break;
                        }
                        default:
                            break;
                        }
                    }
                } else {
                    qDebug() << "读取错误:" << reply->errorString();
                }
                reply->deleteLater();  //释放资源
            });
        } else {
            reply->deleteLater();   //处理已完成的响应
        }
    } else {
        qDebug() << "读取请求失败";
    }
}



----- 数据写入 -----


06 功能码
/*--------------------widget.h --------------------*/
void writeSingleRegister(quint8 slaveAddress, quint16 startAddress, int data)
 
/*--------------------widget.cpp --------------------*/
//写入保持寄存器(06 功能码)
void Widget::writeSingleRegister(quint8 slaveAddress, quint16 startAddress, int data)
{
    //检查连接
    if (data < 0 || data > 65535) {
        qDebug() << "错误:写入值超出范围(0~65535),实际值:" << data;
        return;
    }
 
    //检查写入值 data 是否超出 保持寄存器 范围(0 ~ 65535)
    if (RTU_Device->state() != QModbusDevice::ConnectedState) {
        qDebug() << "Modbus 设备未连接";
        return;
    }
 
    //安全转换为 quint16
    quint16 valueToWrite = static_cast<quint16>(data);
 
    //创建写入请求(写入 1 个寄存器)
    QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, startAddress, 1);
 
    //设置第0个寄存器(即 startAddress 对应的那个)的值为 valueToWrite
    writeUnit.setValue(0, valueToWrite);
 
    //发送写请求到指定从站地址
    QModbusReply *reply = RTU_Device->sendWriteRequest(writeUnit, slaveAddress);
 
    if (!reply) {
        qDebug() << "写入失败:无法创建写请求";
        return;
    }
 
    if (!reply->isFinished()) {
        //异步:等待 Modbus 设备回复
        QObject::connect(reply, &QModbusReply::finished, this, [this, reply]() {
            if (reply->error() == QModbusDevice::NoError) {
                qDebug() << "写入成功!";
            } else {
                qDebug() << "写入失败,错误:" << reply->errorString();
            }
            reply->deleteLater();  //须释放内存
        });
    } else {
        //如果回复已经完成(极少数同步情况)
        if (reply->error() == QModbusDevice::NoError) {
            qDebug() << "写入成功!";
        } else {
            qDebug() << "写入失败,错误:" << reply->errorString();
        }
        reply->deleteLater();  //须释放内存
    }
}